/*
    Script: dxd.class-1.2.2.1.js
    Clase DxD.Base.

    License:
    MIT-style license.

    @author: Damián Súarez (damian.suarez@xifox.net)
 */

DxD.Base = new Class({

	Extends: DxD,

	options: {
		dragDelete: false,
		randomPosDrags: true,
		randomPosDrops: false,
		multiDrop: false,
		sendToBack: false,
		textInDrop: true,
		
		optionsFxDrag: {
			wait: false,
			duration: 800,
			transition: Fx.Transitions.Back.easeOut
		},
		optionsFxDrop: {
			wait: false,
			duration: 800,
			transition: Fx.Transitions.Back.easeOut
		}
	},

	initialize: function(drags, drops, options){
		this.parent(drags, drops, options);
		this.setIniBase();

		this.addEvents ({
			'emptyDrop': this.dragEmptyDrop.bind(this),
			'complete': this.dragComplete.bind(this),
			'drop': this.dropComplete.bind(this),
			'enter': function ($objDrag, $objDrop) {
				$objDrop.node.set('text', $objDrag.text);
			},
			'leave': function($objDrag, $objDrop){
				$objDrop.node.set('text', $objDrop.text);
			}
	});
	},
	
	adjustPos: function () {
//		if (this.options.randomPosDrags) this.options.adjDrags.randomize();
//		if (this.options.randomPosDrops) this.options.adjDrops.randomize();
		this.parent();
	},
	
	setIniBase: function () {

		// Drops
		this.elDrops.each (function ($objDrop, $iOB) {
			$objDrop.text = $objDrop.node.get('text');
			$objDrop.fx = new Fx.Morph($objDrop.node, this.options.optionsFxDrop);
		}.bind(this));

		// Drags
		this.elDrags.each (function ($objDrag, $iOB) {
			$objDrag.text = $objDrag.node.get('text');
			$objDrag.fx = new Fx.Morph($objDrag.node, this.options.optionsFxDrag);
		}.bind(this));
	},

	fncTrueDrop: function($objDrag, $objDrop){
		return ($objDrag.ind == $objDrop.ind) ? true : false;
	},

	dragEmptyDrop: function ($objDrag, $objLastDrop) {
		switch (this.options.sendToBack) {
			case 'ini':
				$objDrag.backPos = this.options.adjDrags[$objDrag.ind];
			break;

			case 'back':
				$objDrag.backPos = {
					x: $objDrag.value.now.x,
					y: $objDrag.value.now.y
				}
			break;
		};

		this.sendToBack ($objDrag);
	},

	dragComplete: function ($objDrag) {
		var nada = '';
	},

	dropComplete: function ($objDrag, $objDrop) {
		if (!this.fncTrueDrop($objDrag, $objDrop)) {
			$objDrop.dragsInDrop.erase ($objDrag);
			
			// Eliminamos clases CSS en drag y drops
			$objDrag.node.removeClass (this.options.cssClass + '-overDrag');
			$objDrag.node.removeClass (this.options.cssClass + '-dropDrag');

			if (!$objDrop.dragsInDrop.length) {
				$objDrop.node.removeClass(this.options.cssClass + '-overDrop');
				$objDrop.node.removeClass(this.options.cssClass + '-dropDrop');
			};

			this.sendToBack($objDrag);
			this.fireEvent ('falseDrop', [$objDrag, $objDrop]);																						// <-- ev.onFalseDrop
			this.fireEvent ('leave', [$objDrag, $objDrop]);
		}
		else {
			if (this.options.dragDelete) this.deleteDrag($objDrag);
			$objDrop.node.addClass(this.options.cssClass + '-trueDrop');
			this.fireEvent ('trueDrop', [$objDrag, $objDrop]);																						// <-- ev.onTrueDrop
		};
	},

	deleteDrag: function(drag){
		if (this.options.dragDelete) {
			if (this.options.dragDelete == 'none') drag.node.setStyle ('display', 'none');
			else drag.node.destroy();
		}
	},

	sendToBack: function($objDrag){
		$objDrag.fx.start({
			'left': $objDrag.backPos.x,
			'top': $objDrag.backPos.y
		});
	}
});